{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input_dim:  4 , output_dim:  2 , hidden_dim:  16\n",
      "threshold:  475.0\n"
     ]
    }
   ],
   "source": [
    "import gym\n",
    "import numpy as np\n",
    "import torch\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import time\n",
    "\n",
    "from collections import deque\n",
    "from agent import Agent, FloatTensor\n",
    "from replay_buffer import ReplayMemory, Transition\n",
    "from  torch.autograd import Variable\n",
    "\n",
    "# set up matplotlib\n",
    "is_ipython = 'inline' in matplotlib.get_backend()\n",
    "if is_ipython:\n",
    "    from IPython import display\n",
    "\n",
    "plt.ion()\n",
    "\n",
    "use_cuda = torch.cuda.is_available()\n",
    "FloatTensor = torch.cuda.FloatTensor if use_cuda else torch.FloatTensor\n",
    "device = torch.device(\"cuda\" if use_cuda else \"cpu\")\n",
    "\n",
    "BATCH_SIZE = 64  \n",
    "TAU = 0.005 # 1e-3   # for soft update of target parameters\n",
    "gamma = 0.99\n",
    "LEARNING_RATE = 0.001\n",
    "TARGET_UPDATE = 10\n",
    "\n",
    "num_episodes = 5000\n",
    "print_every = 10\n",
    "hidden_dim = 16 ## 12 ## 32 ## 16 ## 64 ## 16\n",
    "min_eps = 0.01\n",
    "max_eps_episode = 50\n",
    "\n",
    "env = gym.make('CartPole-v1')\n",
    "env = gym.wrappers.Monitor(env, directory=\"monitors\", force=True)\n",
    "        \n",
    "space_dim =  env.observation_space.shape[0] # n_spaces\n",
    "action_dim = env.action_space.n # n_actions  \n",
    "print('input_dim: ', space_dim, ', output_dim: ', action_dim, ', hidden_dim: ', hidden_dim)\n",
    "\n",
    "threshold = env.spec.reward_threshold\n",
    "print('threshold: ', threshold)\n",
    "\n",
    "agent = Agent(space_dim, action_dim, hidden_dim)\n",
    "\n",
    "    \n",
    "def epsilon_annealing(i_epsiode, max_episode, min_eps: float):\n",
    "    ##  if i_epsiode --> max_episode, ret_eps --> min_eps\n",
    "    ##  if i_epsiode --> 1, ret_eps --> 1  \n",
    "    slope = (min_eps - 1.0) / max_episode\n",
    "    ret_eps = max(slope * i_epsiode + 1.0, min_eps)\n",
    "    return ret_eps        \n",
    "\n",
    "def save(directory, filename):\n",
    "    torch.save(agent.q_local.state_dict(), '%s/%s_local.pth' % (directory, filename))\n",
    "    torch.save(agent.q_target.state_dict(), '%s/%s_target.pth' % (directory, filename))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_episode(env, agent, eps):\n",
    "    \"\"\"Play an epsiode and train\n",
    "\n",
    "    Args:\n",
    "        env (gym.Env): gym environment (CartPole-v0)\n",
    "        agent (Agent): agent will train and get action        \n",
    "        eps (float): eps-greedy for exploration\n",
    "\n",
    "    Returns:\n",
    "        int: reward earned in this episode\n",
    "    \"\"\"\n",
    "    state = env.reset()\n",
    "    done = False\n",
    "    total_reward = 0\n",
    "    \n",
    "\n",
    "    while not done:\n",
    "\n",
    "        action = agent.get_action(FloatTensor([state]) , eps)\n",
    "        \n",
    "        next_state, reward, done, _ = env.step(action.item())\n",
    "\n",
    "        total_reward += reward\n",
    "\n",
    "        if done:\n",
    "            reward = -1\n",
    "                    \n",
    "        # Store the transition in memory\n",
    "        agent.replay_memory.push(\n",
    "                (FloatTensor([state]), \n",
    "                 action, # action is already a tensor\n",
    "                 FloatTensor([reward]), \n",
    "                 FloatTensor([next_state]), \n",
    "                 FloatTensor([done])))\n",
    "                 \n",
    "\n",
    "        if len(agent.replay_memory) > BATCH_SIZE:\n",
    "\n",
    "            batch = agent.replay_memory.sample(BATCH_SIZE)\n",
    "            \n",
    "            agent.learn(batch, gamma)\n",
    "\n",
    "        state = next_state\n",
    "\n",
    "\n",
    "    return total_reward\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode:    10 Score:  15.0  Avg.Score: 17.82, eps-greedy:  0.80 Time: 00:00:05\n",
      "Episode:    20 Score:  16.0  Avg.Score: 19.29, eps-greedy:  0.60 Time: 00:00:06\n",
      "Episode:    30 Score:  12.0  Avg.Score: 17.48, eps-greedy:  0.41 Time: 00:00:07\n",
      "Episode:    40 Score:  32.0  Avg.Score: 17.76, eps-greedy:  0.21 Time: 00:00:07\n",
      "Episode:    50 Score:   9.0  Avg.Score: 17.08, eps-greedy:  0.01 Time: 00:00:07\n",
      "Episode:    60 Score:  75.0  Avg.Score: 18.05, eps-greedy:  0.01 Time: 00:00:08\n",
      "Episode:    70 Score:  57.0  Avg.Score: 25.04, eps-greedy:  0.01 Time: 00:00:10\n",
      "Episode:    80 Score:  59.0  Avg.Score: 27.57, eps-greedy:  0.01 Time: 00:00:11\n",
      "Episode:    90 Score:  99.0  Avg.Score: 34.04, eps-greedy:  0.01 Time: 00:00:13\n",
      "Episode:   100 Score: 157.0  Avg.Score: 43.47, eps-greedy:  0.01 Time: 00:00:15\n",
      "Episode:   110 Score: 157.0  Avg.Score: 56.87, eps-greedy:  0.01 Time: 00:00:18\n",
      "Episode:   120 Score: 172.0  Avg.Score: 69.95, eps-greedy:  0.01 Time: 00:00:21\n",
      "Episode:   130 Score: 142.0  Avg.Score: 82.50, eps-greedy:  0.01 Time: 00:00:26\n",
      "Episode:   140 Score: 196.0  Avg.Score: 96.50, eps-greedy:  0.01 Time: 00:00:29\n",
      "Episode:   150 Score: 205.0  Avg.Score: 112.54, eps-greedy:  0.01 Time: 00:00:33\n",
      "Episode:   160 Score: 162.0  Avg.Score: 127.06, eps-greedy:  0.01 Time: 00:00:36\n",
      "Episode:   170 Score: 161.0  Avg.Score: 136.62, eps-greedy:  0.01 Time: 00:00:40\n",
      "Episode:   180 Score: 226.0  Avg.Score: 150.97, eps-greedy:  0.01 Time: 00:00:43\n",
      "Episode:   190 Score: 202.0  Avg.Score: 159.75, eps-greedy:  0.01 Time: 00:00:47\n",
      "Episode:   200 Score: 160.0  Avg.Score: 163.28, eps-greedy:  0.01 Time: 00:00:50\n",
      "Episode:   210 Score: 134.0  Avg.Score: 167.27, eps-greedy:  0.01 Time: 00:00:54\n",
      "Episode:   220 Score:  24.0  Avg.Score: 161.40, eps-greedy:  0.01 Time: 00:00:56\n",
      "Episode:   230 Score:  39.0  Avg.Score: 162.56, eps-greedy:  0.01 Time: 00:00:59\n",
      "Episode:   240 Score: 376.0  Avg.Score: 167.48, eps-greedy:  0.01 Time: 00:01:04\n",
      "Episode:   250 Score: 256.0  Avg.Score: 175.44, eps-greedy:  0.01 Time: 00:01:09\n",
      "Episode:   260 Score: 198.0  Avg.Score: 182.73, eps-greedy:  0.01 Time: 00:01:14\n",
      "Episode:   270 Score: 232.0  Avg.Score: 195.12, eps-greedy:  0.01 Time: 00:01:20\n",
      "Episode:   280 Score: 298.0  Avg.Score: 201.34, eps-greedy:  0.01 Time: 00:01:26\n",
      "Episode:   290 Score: 227.0  Avg.Score: 205.15, eps-greedy:  0.01 Time: 00:01:31\n",
      "Episode:   300 Score: 163.0  Avg.Score: 207.08, eps-greedy:  0.01 Time: 00:01:34\n",
      "Episode:   310 Score: 180.0  Avg.Score: 205.31, eps-greedy:  0.01 Time: 00:01:38\n",
      "Episode:   320 Score: 204.0  Avg.Score: 218.13, eps-greedy:  0.01 Time: 00:01:43\n",
      "Episode:   330 Score: 228.0  Avg.Score: 223.19, eps-greedy:  0.01 Time: 00:01:47\n",
      "Episode:   340 Score: 169.0  Avg.Score: 219.96, eps-greedy:  0.01 Time: 00:01:50\n",
      "Episode:   350 Score: 169.0  Avg.Score: 212.11, eps-greedy:  0.01 Time: 00:01:56\n",
      "Episode:   360 Score: 174.0  Avg.Score: 204.89, eps-greedy:  0.01 Time: 00:02:00\n",
      "Episode:   370 Score: 170.0  Avg.Score: 194.87, eps-greedy:  0.01 Time: 00:02:03\n",
      "Episode:   380 Score: 182.0  Avg.Score: 190.79, eps-greedy:  0.01 Time: 00:02:08\n",
      "Episode:   390 Score: 263.0  Avg.Score: 201.56, eps-greedy:  0.01 Time: 00:02:14\n",
      "Episode:   400 Score:  36.0  Avg.Score: 197.38, eps-greedy:  0.01 Time: 00:02:17\n",
      "Episode:   410 Score: 159.0  Avg.Score: 193.72, eps-greedy:  0.01 Time: 00:02:20\n",
      "Episode:   420 Score: 183.0  Avg.Score: 190.13, eps-greedy:  0.01 Time: 00:02:23\n",
      "Episode:   430 Score: 176.0  Avg.Score: 193.28, eps-greedy:  0.01 Time: 00:02:28\n",
      "Episode:   440 Score: 245.0  Avg.Score: 209.10, eps-greedy:  0.01 Time: 00:02:34\n",
      "Episode:   450 Score: 208.0  Avg.Score: 213.85, eps-greedy:  0.01 Time: 00:02:39\n",
      "Episode:   460 Score: 293.0  Avg.Score: 226.13, eps-greedy:  0.01 Time: 00:02:44\n",
      "Episode:   470 Score: 217.0  Avg.Score: 234.03, eps-greedy:  0.01 Time: 00:02:49\n",
      "Episode:   480 Score: 199.0  Avg.Score: 235.62, eps-greedy:  0.01 Time: 00:02:54\n",
      "Episode:   490 Score:  92.0  Avg.Score: 231.71, eps-greedy:  0.01 Time: 00:02:59\n",
      "Episode:   500 Score: 292.0  Avg.Score: 244.05, eps-greedy:  0.01 Time: 00:03:05\n",
      "Episode:   510 Score: 313.0  Avg.Score: 260.33, eps-greedy:  0.01 Time: 00:03:10\n",
      "Episode:   520 Score: 266.0  Avg.Score: 275.85, eps-greedy:  0.01 Time: 00:03:21\n",
      "Episode:   530 Score: 181.0  Avg.Score: 274.06, eps-greedy:  0.01 Time: 00:03:25\n",
      "Episode:   540 Score: 218.0  Avg.Score: 262.27, eps-greedy:  0.01 Time: 00:03:29\n",
      "Episode:   550 Score: 190.0  Avg.Score: 258.46, eps-greedy:  0.01 Time: 00:03:33\n",
      "Episode:   560 Score: 213.0  Avg.Score: 250.30, eps-greedy:  0.01 Time: 00:03:37\n",
      "Episode:   570 Score: 192.0  Avg.Score: 243.51, eps-greedy:  0.01 Time: 00:03:41\n",
      "Episode:   580 Score: 226.0  Avg.Score: 242.19, eps-greedy:  0.01 Time: 00:03:45\n",
      "Episode:   590 Score: 266.0  Avg.Score: 237.15, eps-greedy:  0.01 Time: 00:03:50\n",
      "Episode:   600 Score: 195.0  Avg.Score: 235.55, eps-greedy:  0.01 Time: 00:03:54\n",
      "Episode:   610 Score:  12.0  Avg.Score: 206.48, eps-greedy:  0.01 Time: 00:03:55\n",
      "Episode:   620 Score: 134.0  Avg.Score: 178.46, eps-greedy:  0.01 Time: 00:03:56\n",
      "Episode:   630 Score: 244.0  Avg.Score: 181.05, eps-greedy:  0.01 Time: 00:04:01\n",
      "Episode:   640 Score: 374.0  Avg.Score: 191.74, eps-greedy:  0.01 Time: 00:04:07\n",
      "Episode:   650 Score: 257.0  Avg.Score: 217.72, eps-greedy:  0.01 Time: 00:04:16\n",
      "Episode:   660 Score: 207.0  Avg.Score: 221.17, eps-greedy:  0.01 Time: 00:04:21\n",
      "Episode:   670 Score: 222.0  Avg.Score: 226.38, eps-greedy:  0.01 Time: 00:04:26\n",
      "Episode:   680 Score: 500.0  Avg.Score: 255.07, eps-greedy:  0.01 Time: 00:04:37\n",
      "Episode:   690 Score: 179.0  Avg.Score: 257.70, eps-greedy:  0.01 Time: 00:04:42\n",
      "Episode:   700 Score: 128.0  Avg.Score: 243.47, eps-greedy:  0.01 Time: 00:04:44\n",
      "Episode:   710 Score: 137.0  Avg.Score: 256.31, eps-greedy:  0.01 Time: 00:04:47\n",
      "Episode:   720 Score: 142.0  Avg.Score: 263.67, eps-greedy:  0.01 Time: 00:04:50\n",
      "Episode:   730 Score: 133.0  Avg.Score: 251.02, eps-greedy:  0.01 Time: 00:04:54\n",
      "Episode:   740 Score: 135.0  Avg.Score: 232.01, eps-greedy:  0.01 Time: 00:04:56\n",
      "Episode:   750 Score: 150.0  Avg.Score: 201.93, eps-greedy:  0.01 Time: 00:04:59\n",
      "Episode:   760 Score: 126.0  Avg.Score: 191.00, eps-greedy:  0.01 Time: 00:05:02\n",
      "Episode:   770 Score: 119.0  Avg.Score: 178.17, eps-greedy:  0.01 Time: 00:05:04\n",
      "Episode:   780 Score: 118.0  Avg.Score: 140.46, eps-greedy:  0.01 Time: 00:05:06\n",
      "Episode:   790 Score: 132.0  Avg.Score: 127.43, eps-greedy:  0.01 Time: 00:05:09\n",
      "Episode:   800 Score: 154.0  Avg.Score: 132.45, eps-greedy:  0.01 Time: 00:05:12\n",
      "Episode:   810 Score: 130.0  Avg.Score: 131.77, eps-greedy:  0.01 Time: 00:05:15\n",
      "Episode:   820 Score: 134.0  Avg.Score: 132.73, eps-greedy:  0.01 Time: 00:05:17\n",
      "Episode:   830 Score: 163.0  Avg.Score: 138.30, eps-greedy:  0.01 Time: 00:05:21\n",
      "Episode:   840 Score: 156.0  Avg.Score: 139.72, eps-greedy:  0.01 Time: 00:05:24\n",
      "Episode:   850 Score: 147.0  Avg.Score: 140.18, eps-greedy:  0.01 Time: 00:05:27\n",
      "Episode:   860 Score: 135.0  Avg.Score: 140.26, eps-greedy:  0.01 Time: 00:05:29\n",
      "Episode:   870 Score: 147.0  Avg.Score: 142.81, eps-greedy:  0.01 Time: 00:05:32\n",
      "Episode:   880 Score: 127.0  Avg.Score: 144.17, eps-greedy:  0.01 Time: 00:05:35\n",
      "Episode:   890 Score: 125.0  Avg.Score: 144.03, eps-greedy:  0.01 Time: 00:05:38\n",
      "Episode:   900 Score: 159.0  Avg.Score: 138.30, eps-greedy:  0.01 Time: 00:05:39\n",
      "Episode:   910 Score: 196.0  Avg.Score: 146.41, eps-greedy:  0.01 Time: 00:05:44\n",
      "Episode:   920 Score: 170.0  Avg.Score: 150.53, eps-greedy:  0.01 Time: 00:05:47\n",
      "Episode:   930 Score: 156.0  Avg.Score: 149.88, eps-greedy:  0.01 Time: 00:05:51\n",
      "Episode:   940 Score: 214.0  Avg.Score: 154.72, eps-greedy:  0.01 Time: 00:05:55\n",
      "Episode:   950 Score: 204.0  Avg.Score: 160.78, eps-greedy:  0.01 Time: 00:05:59\n",
      "Episode:   960 Score: 185.0  Avg.Score: 166.87, eps-greedy:  0.01 Time: 00:06:03\n",
      "Episode:   970 Score: 172.0  Avg.Score: 169.46, eps-greedy:  0.01 Time: 00:06:06\n",
      "Episode:   980 Score: 191.0  Avg.Score: 174.87, eps-greedy:  0.01 Time: 00:06:10\n",
      "Episode:   990 Score: 146.0  Avg.Score: 178.50, eps-greedy:  0.01 Time: 00:06:13\n",
      "Episode:  1000 Score: 160.0  Avg.Score: 184.41, eps-greedy:  0.01 Time: 00:06:19\n",
      "Episode:  1010 Score: 172.0  Avg.Score: 180.05, eps-greedy:  0.01 Time: 00:06:22\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Episode:  1020 Score: 145.0  Avg.Score: 176.77, eps-greedy:  0.01 Time: 00:06:26\n",
      "Episode:  1030 Score: 157.0  Avg.Score: 176.28, eps-greedy:  0.01 Time: 00:06:29\n",
      "Episode:  1040 Score: 168.0  Avg.Score: 174.17, eps-greedy:  0.01 Time: 00:06:32\n",
      "Episode:  1050 Score: 173.0  Avg.Score: 169.99, eps-greedy:  0.01 Time: 00:06:36\n",
      "Episode:  1060 Score: 173.0  Avg.Score: 167.73, eps-greedy:  0.01 Time: 00:06:39\n",
      "Episode:  1070 Score: 155.0  Avg.Score: 165.62, eps-greedy:  0.01 Time: 00:06:42\n",
      "Episode:  1080 Score: 175.0  Avg.Score: 164.00, eps-greedy:  0.01 Time: 00:06:46\n",
      "Episode:  1090 Score: 185.0  Avg.Score: 163.75, eps-greedy:  0.01 Time: 00:06:49\n",
      "Episode:  1100 Score: 218.0  Avg.Score: 166.74, eps-greedy:  0.01 Time: 00:06:53\n",
      "Episode:  1110 Score: 198.0  Avg.Score: 169.42, eps-greedy:  0.01 Time: 00:06:57\n",
      "Episode:  1120 Score: 191.0  Avg.Score: 173.94, eps-greedy:  0.01 Time: 00:07:01\n",
      "Episode:  1130 Score: 219.0  Avg.Score: 180.41, eps-greedy:  0.01 Time: 00:07:05\n",
      "Episode:  1140 Score: 236.0  Avg.Score: 185.53, eps-greedy:  0.01 Time: 00:07:10\n",
      "Episode:  1150 Score: 200.0  Avg.Score: 189.47, eps-greedy:  0.01 Time: 00:07:14\n",
      "Episode:  1160 Score: 202.0  Avg.Score: 191.71, eps-greedy:  0.01 Time: 00:07:18\n",
      "Episode:  1170 Score: 375.0  Avg.Score: 209.42, eps-greedy:  0.01 Time: 00:07:24\n",
      "Episode:  1180 Score: 254.0  Avg.Score: 216.08, eps-greedy:  0.01 Time: 00:07:29\n",
      "Episode:  1190 Score: 301.0  Avg.Score: 229.31, eps-greedy:  0.01 Time: 00:07:35\n",
      "Episode:  1200 Score: 319.0  Avg.Score: 240.59, eps-greedy:  0.01 Time: 00:07:41\n",
      "Episode:  1210 Score: 341.0  Avg.Score: 249.12, eps-greedy:  0.01 Time: 00:07:47\n",
      "Episode:  1220 Score: 271.0  Avg.Score: 256.79, eps-greedy:  0.01 Time: 00:07:52\n",
      "Episode:  1230 Score: 281.0  Avg.Score: 261.46, eps-greedy:  0.01 Time: 00:07:58\n",
      "Episode:  1240 Score: 234.0  Avg.Score: 259.97, eps-greedy:  0.01 Time: 00:08:02\n",
      "Episode:  1250 Score: 500.0  Avg.Score: 268.50, eps-greedy:  0.01 Time: 00:08:08\n",
      "Episode:  1260 Score: 500.0  Avg.Score: 298.82, eps-greedy:  0.01 Time: 00:08:18\n",
      "Episode:  1270 Score: 500.0  Avg.Score: 315.89, eps-greedy:  0.01 Time: 00:08:28\n",
      "Episode:  1280 Score: 500.0  Avg.Score: 341.79, eps-greedy:  0.01 Time: 00:08:38\n",
      "Episode:  1290 Score: 500.0  Avg.Score: 362.66, eps-greedy:  0.01 Time: 00:08:48\n",
      "Episode:  1300 Score: 500.0  Avg.Score: 382.44, eps-greedy:  0.01 Time: 00:08:58\n",
      "Episode:  1310 Score: 500.0  Avg.Score: 404.37, eps-greedy:  0.01 Time: 00:09:08\n",
      "Episode:  1320 Score: 500.0  Avg.Score: 423.51, eps-greedy:  0.01 Time: 00:09:17\n",
      "Episode:  1330 Score: 500.0  Avg.Score: 436.35, eps-greedy:  0.01 Time: 00:09:25\n",
      "Episode:  1340 Score: 500.0  Avg.Score: 465.31, eps-greedy:  0.01 Time: 00:09:35\n",
      "\n",
      " Environment solved in 1344 episodes!\tAverage Score: 475.46\n"
     ]
    }
   ],
   "source": [
    "def train():    \n",
    "\n",
    "    scores_deque = deque(maxlen=100)\n",
    "    scores_array = []\n",
    "    avg_scores_array = []    \n",
    "    \n",
    "    time_start = time.time()\n",
    "\n",
    "    for i_episode in range(num_episodes):\n",
    "        eps = epsilon_annealing(i_episode, max_eps_episode, min_eps)\n",
    "        score = run_episode(env, agent, eps)\n",
    "\n",
    "        scores_deque.append(score)\n",
    "        scores_array.append(score)\n",
    "        \n",
    "        avg_score = np.mean(scores_deque)\n",
    "        avg_scores_array.append(avg_score)\n",
    "\n",
    "        dt = (int)(time.time() - time_start)\n",
    "            \n",
    "        if i_episode % print_every == 0 and i_episode > 0:\n",
    "            print('Episode: {:5} Score: {:5}  Avg.Score: {:.2f}, eps-greedy: {:5.2f} Time: {:02}:{:02}:{:02}'.\\\n",
    "                    format(i_episode, score, avg_score, eps, dt//3600, dt%3600//60, dt%60))\n",
    "            \n",
    "        if len(scores_deque) == scores_deque.maxlen:\n",
    "            ### 195.0: for cartpole-v0 and 475 for v1\n",
    "            if np.mean(scores_deque) >= threshold: \n",
    "                print('\\n Environment solved in {:d} episodes!\\tAverage Score: {:.2f}'. \\\n",
    "                    format(i_episode, np.mean(scores_deque)))\n",
    "                break\n",
    "\n",
    "                        \n",
    "        if i_episode % TARGET_UPDATE == 0:\n",
    "            agent.q_target.load_state_dict(agent.q_local.state_dict()) \n",
    "    \n",
    "    return scores_array, avg_scores_array\n",
    "\n",
    "scores, avg_scores = train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "length of scores:  1345 , len of avg_scores:  1345\n"
     ]
    },
    {
     "data": {
      "image/png": "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q6++uhhg2LBhFdnZ2T7JkDZs2JCcmZlZOWDAgEqAG2644eiSJUuaOfdfc801xwCGDx9eXlBQYNgyoGeBDcVR+qeffmr+2Wefterdu3fOaaed1ufYsWOWrVu3JgP079+/LCcnp8pisXDllVcWL168uKn7sYMHDz61ePHi5rfddlvH2bNnN23VqpXN33WuX78+OTMzs7J///6VTsuOc5wFCxY0f+GFF9r37t07Z9SoUb0qKyvFzp07E88444yy559/vv2jjz7abseOHYlNmzY1/K1SFhNFnRGtH/8PV+Tz/nLtASUSZcfQMo2rbygDhy6Lom6I/lJO+Pl1vJdyulbv1F7Ei+NrEMtGLCgsLDSvWLGieW5ubsqdd96JzWYTQgj52muv7UtNTZWnn3566RdffNH8008/belURox874P1SU5OlgAWi0VarVbDn3ZWVla100ICkJ+fn9iuXbtqgFatWlnz8/MTunTpUp2fn5+Qnp7uY3KQUornn39+7+TJk0vc27/99ttm3gqO9/aAAQMq165du/Xzzz9v8eijj3b86aefSiZNmnTcn6z+FCYpJbNmzdo5cODASvf2wYMHV4wePbrsyy+/bDF+/Pjs6dOn51166aWlft8MN5TFRFHnhBNK6c6eI2VRkSMUZSNgVI6UrolIpZqIL+qTP5Dd7rndtWqH9kI5vvrlww8/bDlp0qSjBw4c2LR///5NhYWFGzMzM6vmzJnTFOA3v/lN8Xvvvdd61apVzSZNmlQCMHLkyJOffPJJS4A1a9Yk5+bmpniPO2jQoIr9+/cnbt68OQnggw8+aDV69GhDk2wgunTpUt2kSRP7vHnzmtjtdmbMmNFq4sSJxwEuuOCC42+88UYrgDfeeKPVhRde6KM0nHfeeSdee+21jMrKSgGwcePGpJKSEhNoSznbt29PtNlszJo1K91b3ry8vIRmzZrZb7/99uK777770Pr161P9XeegQYMq9u3bl7hly5Yk0JyLneOMGzeu5Pnnn2/rjCZaunRpCsDWrVsT+/TpU/nYY48dPv/884+vX7/e5331h7KYKOKeaE3+RuYkV7iwispRhEBY4cJe21lVucrxNQgzZ85s9cADDxx0b5s4ceKxDz/8MP3CCy88efnll5fceuutXc8999zjTivH/fffX3TllVdmZWdn5/Tr16+8V69ep1q2bOkRtZKamipf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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "    \n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "print('length of scores: ', len(scores), ', len of avg_scores: ', len(avg_scores))\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "plt.plot(np.arange(1, len(scores)+1), scores, label=\"Score\")\n",
    "plt.plot(np.arange(1, len(avg_scores)+1), avg_scores, label=\"Avg on 100 episodes\")\n",
    "plt.legend(bbox_to_anchor=(1.05, 1)) \n",
    "plt.ylabel('Score')\n",
    "plt.xlabel('Episodes #')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "save('dir_chk_V1', 'cartpole-v1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "ml2-kernel",
   "language": "python",
   "name": "ml2-kernel"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
